#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>
#include <QThread>
#include <QTimer>
#include <QColorDialog>
#include <QPalette>
#include <QSettings>
#include <QDir>

#include "AGV_Function_Selection.h"
#include "AGV_Display.h"
#include "AGV_Send_TaskDialog.h"
#include "PackageData.h"
#include "MyDatabase.h"
#include "MyDatabase_Parameters.h"
#include "AGV_Send_API_Commands.h"
#include "TableButtonFunction.h"

#include "../src/DockManager.h"
#include <../src/DockWidget.h>
#include <../src/DockAreaWidget.h>

#include "Logger.h"
#include "LoggerDialog.h"
#include "SignalAnalysis.h"


namespace Ui {
class MainWindow;
}


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    /**
     * @brief  项目主窗口类构造函数和析构函数
     * @param  parent 父窗口
     */
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    /**
     * @brief  存放各种连接的函数
     */
    void connectInit();

    /**
     * @brief  判断配置文件打开情况以及数据库连接情况
     * @param  configPath 数据库配置文件名
     * @return  返回数据库是否连接成功
     */
    bool openDatabase(const QString& configPath);

    /**
     * @brief  获取数据库配置文件数据
     * @param  configPath 数据库配置文件名
     * @return  返回不同结果
     */
    int loadConfig(const QString& configPath);

    /**
     * @brief  保存数据库配置文件数据
     * @param  configPath 数据库配置文件名
     * @return  返回保存是否成功
     */
    bool saveConfig(const QString& configPath, QMap<QString, QVariant>& data);

signals:
    void sendnewAGVlist(const QStringList&);
    void sendTaskDialogIndex(const int&, const int&);

    // 测试信号通信
    void sendobj(const QJsonObject&);

public slots:
    /**
     * @brief  小车添加界面
     */
    void showAdd_newAGV();

    /**
     * @brief  小车添加数据
     * @param  list 添加的小车信息
     */
    void getnewAGVdata(const QStringList& list);

    /**
     * @brief  任务发送界面
     * @param  index 显示指定界面的索引
     */
    void showAGV_Send_TaskDialog(const int& index, const int& taskId);

    /**
     * @brief  修改数据库配置参数
     */
    void AlterMyDatabase();

    /**
     * @brief  显示界面索引选择界面
     */
    void showUI();

    /**
     * @brief  显示表数据显示界面
     */
    void showDisplyWindow();

    /**
     * @brief  日志界面显示
     */
    void showLogDialog();

    /**
     * @brief  重新连接数据库
     */
    void reconnectDtabase();

    /**
     * @brief  设置数据库配置文件名
     * @param  path  数据库配置文件名
     */
    void setConfigpath(QString& path)
    {
        m_configPath = path;
    }

    /**
     * @brief  显示调试盘
     */
    void showColorDialog();
    void test();
private:
    Ui::MainWindow *ui;
    // 界面选择
    AGV_Function_Selection   *AGV_F_S;
    // 数据显示界面
    AGV_Display              *AGV_D;
    // AGV添加界面
    AddNewAGV                *Add_newAGV;
    // AGV任务发送界面
    AGV_Send_TaskDialog      *AGV_Send_Task;
    // API协议发送界面
    AGV_Send_API_Commands    *AGV_Send_API;
    // 数据库参数设置窗口
    MyDatabase_Parameters    *MyDatabase_P;
    // 按键设置类指针
    TableButtonFunction      *TableButton;

    // 浮动窗口类指针
    ads::CDockWidget *DockWidget_D;
    ads::CDockWidget *DockWidget_F_S;

    // 信号处理类指针
    SignalAnalysis   *Singals;
    // 日志类指针
    LoggerDialog     *logDialog;
    // 数据库配置文件名
    QString m_configPath;

    // 调试盘窗口指针
    QWidget          *colorWidget;

};



#endif // MAINWINDOW_H
